﻿/*
Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
CKEDITOR.dialog.add('select', function (editor) {
    // Add a new option to a SELECT object (combo or list).
    var _fieldName = '';
    var _caption = '';
    var _idName = '';
    var _datasourcetype = '';
    var _datasource = '';
    function addOption(combo, optionText, optionValue, documentObject, index) {
        combo = getSelect(combo);
        var oOption;
        if (documentObject)
            oOption = documentObject.createElement("OPTION");
        else
            oOption = document.createElement("OPTION");

        if (combo && oOption && oOption.getName() == 'option') {
            if (CKEDITOR.env.ie) {
                if (!isNaN(parseInt(index, 10)))
                    combo.$.options.add(oOption.$, index);
                else
                    combo.$.options.add(oOption.$);

                oOption.$.innerHTML = optionText.length > 0 ? optionText : '';
                oOption.$.value = optionValue;
            }
            else {
                if (index !== null && index < combo.getChildCount())
                    combo.getChild(index < 0 ? 0 : index).insertBeforeMe(oOption);
                else
                    combo.append(oOption);

                oOption.setText(optionText.length > 0 ? optionText : '');
                oOption.setValue(optionValue);
            }
        }
        else
            return false;

        return oOption;
    }
    // Remove all selected options from a SELECT object.
    function removeSelectedOptions(combo) {
        combo = getSelect(combo);

        // Save the selected index
        var iSelectedIndex = getSelectedIndex(combo);

        // Remove all selected options.
        for (var i = combo.getChildren().count() - 1; i >= 0; i--) {
            if (combo.getChild(i).$.selected)
                combo.getChild(i).remove();
        }

        // Reset the selection based on the original selected index.
        setSelectedIndex(combo, iSelectedIndex);
    }
    //Modify option  from a SELECT object.
    function modifyOption(combo, index, title, value) {
        combo = getSelect(combo);
        if (index < 0)
            return false;
        var child = combo.getChild(index);
        child.setText(title);
        child.setValue(value);
        return child;
    }
    function removeAllOptions(combo) {
        combo = getSelect(combo);
        while (combo.getChild(0) && combo.getChild(0).remove())
        { /*jsl:pass*/ }
    }
    // Moves the selected option by a number of steps (also negative).
    function changeOptionPosition(combo, steps, documentObject) {
        combo = getSelect(combo);
        var iActualIndex = getSelectedIndex(combo);
        if (iActualIndex < 0)
            return false;

        var iFinalIndex = iActualIndex + steps;
        iFinalIndex = (iFinalIndex < 0) ? 0 : iFinalIndex;
        iFinalIndex = (iFinalIndex >= combo.getChildCount()) ? combo.getChildCount() - 1 : iFinalIndex;

        if (iActualIndex == iFinalIndex)
            return false;

        var oOption = combo.getChild(iActualIndex),
			sText = oOption.getText(),
			sValue = oOption.getValue();

        oOption.remove();

        oOption = addOption(combo, sText, sValue, (!documentObject) ? null : documentObject, iFinalIndex);
        setSelectedIndex(combo, iFinalIndex);
        return oOption;
    }
    function getSelectedIndex(combo) {
        combo = getSelect(combo);
        return combo ? combo.$.selectedIndex : -1;
    }
    function setSelectedIndex(combo, index) {
        combo = getSelect(combo);
        if (index < 0)
            return null;
        var count = combo.getChildren().count();
        combo.$.selectedIndex = (index >= count) ? (count - 1) : index;
        return combo;
    }
    function getOptions(combo) {
        combo = getSelect(combo);
        return combo ? combo.getChildren() : false;
    }
    function getSelect(obj) {
        if (obj && obj.domId && obj.getInputElement().$)				// Dialog element.
            return obj.getInputElement();
        else if (obj && obj.$)
            return obj;
        return false;
    }

    return {
        title: editor.lang.select.title,
        minWidth: CKEDITOR.env.ie ? 460 : 395,
        minHeight: CKEDITOR.env.ie ? 320 : 300,
        onShow: function () {
            delete this.selectBox;
            this.setupContent('clear');
            var element = this.getParentEditor().getSelection().getSelectedElement();
            if (element && element.getName() == "select") {
                this.selectBox = element;
                this.setupContent(element.getName(), element);

                // Load Options into dialog.
                var objOptions = getOptions(element);
                for (var i = 0; i < objOptions.count(); i++)
                    this.setupContent('option', objOptions.getItem(i));
            }
        },
        onOk: function () {
            var editor = this.getParentEditor(),
				element = this.selectBox,
				isInsertMode = !element;

            if (isInsertMode)
                element = editor.document.createElement('select');
            this.commitContent(element);

            if (isInsertMode) {
                editor.insertElement(element);
                if (CKEDITOR.env.ie) {
                    var sel = editor.getSelection(),
						bms = sel.createBookmarks();
                    setTimeout(function () {
                        sel.selectBookmarks(bms);
                    }, 0);
                }
            }
        },
        contents: [
			{
			    id: 'info',
			    label: editor.lang.select.selectInfo,
			    title: editor.lang.select.selectInfo,
			    accessKey: '',
			    elements: [
                	{
                	    id: 'datafields',
                	    type: 'select',
                	    widths: ['21%', '75%'],
                	    style: 'width:86%;',
                	    labelLayout: 'horizontal',
                	    label: editor.lang.select.datafields,
                	    'default': '',
                	    accessKey: 'D',
                	    items: DIF.MasterData.getMasterFieldData(),
                	    onChange: function (obj) {
                	        _fieldName = this.getValue();
                	        var isExist = $.inArray(this.getValue(), ControlArray);
                	        if (isExist < 0) {
                	            var dialog = this.getDialog();
                	            var selectValue = this.getValue();

                	            var Item = jlinq.from(this.items).equals('1', selectValue).select();
                	            if (typeof (Item) != "undefined") {
                	                if (typeof (Item[0]) != "undefined") { _caption = Item[0][0]; }
                	            }

                	            //_fieldName = selectValue;
                	            var textfieldName = dialog.getContentElement('info', 'txtName');
                	            textfieldName.setValue(selectValue);
                	            textfieldName.getElement().show();
                	        }
                             else {
                	            if (obj.data.value != _idName) {
                	                alert(editor.lang.select.isexist_datafields);
                	            }
                	        }
                	    },
                	    setup: function (name, element) {
                	        if (name == 'select') {
                	            //var oValue = element.getValue();
                	            _idName = element.getAttribute('id');
                	            this.setValue(element.getAttribute('datafields'));
                	        }
                	    }
                            ,
                	    commit: function (element) {
                	        if (this.getValue()) {
                	            element.setAttribute('datafields', this.getValue());
                	            element.setAttribute('title', _caption);
                	        }
                	        else {
                	            element.removeAttribute('datafields');
                	            element.removeAttribute('title');

                	        }
                	    }
                	},
					{
					    id: 'txtName',
					    type: 'text',
					    widths: ['25%', '75%'],
					    labelLayout: 'horizontal',
					    label: editor.lang.common.name,
					    'default': '',
					    accessKey: 'N',
					    style: 'width:350px',
					    setup: function (name, element) {
					        if (name == 'clear')
					            this.setValue(this['default'] || '');
					        else if (name == 'select') {
					            this.setValue(
										element.data('cke-saved-name') ||
										element.getAttribute('name') ||
										'');
					        }
					    },
					    commit: function (element) {
					        if (this.getValue()) {
					            element.data('cke-saved-name', this.getValue());
					            element.setAttribute('id', this.getValue());
					        }
					        else {
					            element.data('cke-saved-name', false);
					            element.removeAttribute('name');
					            element.removeAttribute('id');
					        }
					    }
					},
					{
					    id: 'txtValue',
					    type: 'text',
					    widths: ['25%', '75%'],
					    labelLayout: 'horizontal',
					    label: editor.lang.select.value,
					    style: 'width:350px',
					    'default': '',
					    className: 'cke_disabled',
					    onLoad: function () {
					        this.getInputElement().setAttribute('readOnly', true);
					    },
					    setup: function (name, element) {
					        if (name == 'clear')
					            this.setValue('');
					        else if (name == 'option' && element.getAttribute('selected'))
					            this.setValue(element.$.value);
					    }
					},
					{
					    id: 'dataSourcetype',
					    type: 'select',
					    widths: ['21%', '75%'],
					    style: 'width:86%;',
					    labelLayout: 'horizontal',
					    label: editor.lang.select.dataSourcetype,
					    'default': '',
					    accessKey: 'D',
					    items: [
                                [editor.lang.select.fixdata, 'FIX'],
                                [editor.lang.select.dixdata, 'DIC'],
							    [editor.lang.select.sqldata, 'SQL'],
                                [editor.lang.select.jsondata, 'JSON']
						    ],
					    setup: function (name, element) {
					        if (name == 'select') {
					            if (_fieldName != '') {
					                var item = DIF.getFieldItem(_fieldName);
					                if (item) {
					                    if (!item.DataSourceType) { this.setValue(); }
					                    else { this.setValue(item.DataSourceType); }
					                }
					            }
					        }
					    }
                            ,
					    commit: function (element) {
					        if (this.getValue()) {
					            _datasourcetype = this.getValue();
					            if (_fieldName != '') {
					                var item = DIF.getFieldItem(_fieldName);
					                if (item) {
					                    item.DataSourceType = _datasourcetype;
					                } else {
					                    var _elementType = "";
					                    if(element.$)
                                        {
					                     _elementType= element.$.tagName.toLowerCase();
                                        }
					                    DIF.AddFieldItem(
                                        NewGuid(),
                                        DIF.getFormID(),
                                        DIF.getMasterTableName(),
                                        _caption,
                                        _fieldName,
                                        '',
                                        _datasourcetype,
                                        _datasource,
                                        0,
                                       _elementType
                                        );
					                }
					            }

					        }
					        else {
					            if (_fieldName != '') {
					                var item = DIF.getFieldItem(_fieldName);
					                if (item) {
					                    item.DataSourceType = '';
					                }
					            }
					        }
					    }
					},
                    {
                        id: 'dataSource',
                        type: 'textarea',
                        widths: ['21%', '75%'],
                        style: 'width:86%;',
                        labelLayout: 'horizontal',
                        label: editor.lang.select.dataSource,
                        'default': '',
                        accessKey: 'N',
                        setup: function (name, element) {
                            if (name == 'select') {
                                if (_fieldName != '') {
                                    var item = DIF.getFieldItem(_fieldName);
                                    if (item) {
                                        if (!item.DataSource) { this.setValue(); }
                                        else { this.setValue(item.DataSource); }
                                    }
                                }
                            }
                        },
                        commit: function (element) {
                            if (this.getValue()) {
                                _datasource = this.getValue();
                                if (_fieldName != '') {
                                    var item = DIF.getFieldItem(_fieldName);
                                    if (item) {
                                        item.DataSource = _datasource;
                                    } else {
                                        var _elementType = "";
                                        if (element.$) {
                                            _elementType = element.$.tagName.toLowerCase();
                                        }
                                        //id, formid, tablename, caption, fieldname, defualtvalue, datasourcetype, datasource, isrequire
                                        DIF.AddFieldItem(
                                            NewGuid(),
                                            DIF.getFormID(),
                                            DIF.getMasterTableName(),
                                            _caption,
                                            _fieldName,
                                            '',
                                            _datasourcetype,
                                            _datasource,
                                            0,
                                            _elementType
                                            );
                                    }

                                }
                            }
                            else {
                                if (_fieldName != '') {
                                    var item = DIF.getFieldItem(_fieldName);
                                    if (item) {
                                        item.DataSource = '';
                                    }
                                }
                            }
                        }

                    },
                    {
                        type: 'hbox',
                        widths: ['175px', '170px'],
                        children:
						[
							{
							    id: 'txtSize',
							    type: 'text',
							    labelLayout: 'horizontal',
							    label: editor.lang.select.size,
							    'default': '',
							    accessKey: 'S',
							    style: 'width:175px',
							    validate: function () {
							        var func = CKEDITOR.dialog.validate.integer(editor.lang.common.validateNumberFailed);
							        return ((this.getValue() === '') || func.apply(this));
							    },
							    setup: function (name, element) {
							        if (name == 'select')
							            this.setValue(element.getAttribute('size') || '');
							        if (CKEDITOR.env.webkit)
							            this.getInputElement().setStyle('width', '86px');
							    },
							    commit: function (element) {
							        if (this.getValue())
							            element.setAttribute('size', this.getValue());
							        else
							            element.removeAttribute('size');
							    }
							},
							{
							    type: 'html',
							    html: '<span>' + CKEDITOR.tools.htmlEncode(editor.lang.select.lines) + '</span>'
							}
						]
                    },
					{
					    type: 'html',
					    html: '<span>' + CKEDITOR.tools.htmlEncode(editor.lang.select.opAvail) + '</span>'
					},
					{
					    type: 'hbox',
					    widths: ['115px', '115px', '100px'],
					    children:
						[
							{
							    type: 'vbox',
							    children:
								[
									{
									    id: 'txtOptName',
									    type: 'text',
									    label: editor.lang.select.opText,
									    style: 'width:115px',
									    setup: function (name, element) {
									        if (name == 'clear')
									            this.setValue("");
									    }
									},
									{
									    type: 'select',
									    id: 'cmbName',
									    label: '',
									    title: '',
									    size: 5,
									    style: 'width:115px;height:75px',
									    items: [],
									    onChange: function () {
									        var dialog = this.getDialog(),
												values = dialog.getContentElement('info', 'cmbValue'),
												optName = dialog.getContentElement('info', 'txtOptName'),
												optValue = dialog.getContentElement('info', 'txtOptValue'),
												iIndex = getSelectedIndex(this);

									        setSelectedIndex(values, iIndex);
									        optName.setValue(this.getValue());
									        optValue.setValue(values.getValue());
									    },
									    setup: function (name, element) {
									        if (name == 'clear')
									            removeAllOptions(this);
									        else if (name == 'option')
									            addOption(this, element.getText(), element.getText(),
													this.getDialog().getParentEditor().document);
									    },
									    commit: function (element) {
									        var dialog = this.getDialog(),
												optionsNames = getOptions(this),
												optionsValues = getOptions(dialog.getContentElement('info', 'cmbValue')),
												selectValue = dialog.getContentElement('info', 'txtValue').getValue();

									        removeAllOptions(element);

									        for (var i = 0; i < optionsNames.count(); i++) {
									            var oOption = addOption(element, optionsNames.getItem(i).getValue(),
													optionsValues.getItem(i).getValue(), dialog.getParentEditor().document);
									            if (optionsValues.getItem(i).getValue() == selectValue) {
									                oOption.setAttribute('selected', 'selected');
									                oOption.selected = true;
									            }
									        }
									    }
									}
								]
							},
							{
							    type: 'vbox',
							    children:
								[
									{
									    id: 'txtOptValue',
									    type: 'text',
									    label: editor.lang.select.opValue,
									    style: 'width:115px',
									    setup: function (name, element) {
									        if (name == 'clear')
									            this.setValue("");
									    }
									},
									{
									    type: 'select',
									    id: 'cmbValue',
									    label: '',
									    size: 5,
									    style: 'width:115px;height:75px',
									    items: [],
									    onChange: function () {
									        var dialog = this.getDialog(),
												names = dialog.getContentElement('info', 'cmbName'),
												optName = dialog.getContentElement('info', 'txtOptName'),
												optValue = dialog.getContentElement('info', 'txtOptValue'),
												iIndex = getSelectedIndex(this);

									        setSelectedIndex(names, iIndex);
									        optName.setValue(names.getValue());
									        optValue.setValue(this.getValue());
									    },
									    setup: function (name, element) {
									        if (name == 'clear')
									            removeAllOptions(this);
									        else if (name == 'option') {
									            var oValue = element.getValue();
									            addOption(this, oValue, oValue,
													this.getDialog().getParentEditor().document);
									            if (element.getAttribute('selected') == 'selected')
									                this.getDialog().getContentElement('info', 'txtValue').setValue(oValue);
									        }
									    }
									}
								]
							},
							{
							    type: 'vbox',
							    padding: 5,
							    children:
								[
									{
									    type: 'button',
									    id: 'btnAdd',
									    style: '',
									    label: editor.lang.select.btnAdd,
									    title: editor.lang.select.btnAdd,
									    style: 'width:100%;',
									    onClick: function () {
									        //Add new option.
									        var dialog = this.getDialog(),
												parentEditor = dialog.getParentEditor(),
												optName = dialog.getContentElement('info', 'txtOptName'),
												optValue = dialog.getContentElement('info', 'txtOptValue'),
												names = dialog.getContentElement('info', 'cmbName'),
												values = dialog.getContentElement('info', 'cmbValue');

									        addOption(names, optName.getValue(), optName.getValue(), dialog.getParentEditor().document);
									        addOption(values, optValue.getValue(), optValue.getValue(), dialog.getParentEditor().document);

									        optName.setValue("");
									        optValue.setValue("");
									    }
									},
									{
									    type: 'button',
									    id: 'btnModify',
									    label: editor.lang.select.btnModify,
									    title: editor.lang.select.btnModify,
									    style: 'width:100%;',
									    onClick: function () {
									        //Modify selected option.
									        var dialog = this.getDialog(),
												optName = dialog.getContentElement('info', 'txtOptName'),
												optValue = dialog.getContentElement('info', 'txtOptValue'),
												names = dialog.getContentElement('info', 'cmbName'),
												values = dialog.getContentElement('info', 'cmbValue'),
												iIndex = getSelectedIndex(names);

									        if (iIndex >= 0) {
									            modifyOption(names, iIndex, optName.getValue(), optName.getValue());
									            modifyOption(values, iIndex, optValue.getValue(), optValue.getValue());
									        }
									    }
									},
									{
									    type: 'button',
									    id: 'btnUp',
									    style: 'width:100%;',
									    label: editor.lang.select.btnUp,
									    title: editor.lang.select.btnUp,
									    onClick: function () {
									        //Move up.
									        var dialog = this.getDialog(),
												names = dialog.getContentElement('info', 'cmbName'),
												values = dialog.getContentElement('info', 'cmbValue');

									        changeOptionPosition(names, -1, dialog.getParentEditor().document);
									        changeOptionPosition(values, -1, dialog.getParentEditor().document);
									    }
									},
									{
									    type: 'button',
									    id: 'btnDown',
									    style: 'width:100%;',
									    label: editor.lang.select.btnDown,
									    title: editor.lang.select.btnDown,
									    onClick: function () {
									        //Move down.
									        var dialog = this.getDialog(),
												names = dialog.getContentElement('info', 'cmbName'),
												values = dialog.getContentElement('info', 'cmbValue');

									        changeOptionPosition(names, 1, dialog.getParentEditor().document);
									        changeOptionPosition(values, 1, dialog.getParentEditor().document);
									    }
									}
								]
							}
						]
					},
					{
					    type: 'hbox',
					    widths: ['40%', '20%', '40%'],
					    children:
						[
							{
							    type: 'button',
							    id: 'btnSetValue',
							    label: editor.lang.select.btnSetValue,
							    title: editor.lang.select.btnSetValue,
							    onClick: function () {
							        //Set as default value.
							        var dialog = this.getDialog(),
										values = dialog.getContentElement('info', 'cmbValue'),
										txtValue = dialog.getContentElement('info', 'txtValue');
							        txtValue.setValue(values.getValue());
							    }
							},
							{
							    type: 'button',
							    id: 'btnDelete',
							    label: editor.lang.select.btnDelete,
							    title: editor.lang.select.btnDelete,
							    onClick: function () {
							        // Delete option.
							        var dialog = this.getDialog(),
										names = dialog.getContentElement('info', 'cmbName'),
										values = dialog.getContentElement('info', 'cmbValue'),
										optName = dialog.getContentElement('info', 'txtOptName'),
										optValue = dialog.getContentElement('info', 'txtOptValue');

							        removeSelectedOptions(names);
							        removeSelectedOptions(values);

							        optName.setValue("");
							        optValue.setValue("");
							    }
							},
							{
							    id: 'chkMulti',
							    type: 'checkbox',
							    label: editor.lang.select.chkMulti,
							    'default': '',
							    accessKey: 'M',
							    value: "checked",
							    setup: function (name, element) {
							        if (name == 'select')
							            this.setValue(element.getAttribute('multiple'));
							        if (CKEDITOR.env.webkit)
							            this.getElement().getParent().setStyle('vertical-align', 'middle');
							    },
							    commit: function (element) {
							        if (this.getValue())
							            element.setAttribute('multiple', this.getValue());
							        else
							            element.removeAttribute('multiple');
							    }
							}
						]
					}
				]
			}
		]
    };
});
